From: Jasper St. Pierre Date: Mon, 25 Feb 2013 23:11:59 +0000 (-0500) Subject: workspacesView: Calculate the workspaces geometry ourselves X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~4310 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=f0c2ad00f8674fa3d0a3e9097f07b4b1968e6ad1;p=gnome-shell.git workspacesView: Calculate the workspaces geometry ourselves To ensure that we don't recalculate window layouts when zooming in or out, we need to always pass the full geometry. This will break window repositioning when we zoom back in; for the purposes of commit clarity, this breaks this feature for now. It will be added back soon. https://bugzilla.gnome.org/show_bug.cgi?id=694469 --- diff --git a/js/ui/overviewControls.js b/js/ui/overviewControls.js index ba1cf275d..7563975df 100644 --- a/js/ui/overviewControls.js +++ b/js/ui/overviewControls.js @@ -520,6 +520,8 @@ const ControlsManager = new Lang.Class({ expand: true }); this._group.add_actor(this._thumbnailsSlider.actor); + this._group.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesGeometry)); + Main.overview.connect('showing', Lang.bind(this, this._updateSpacerVisibility)); Main.overview.connect('item-drag-begin', Lang.bind(this, function() { @@ -537,6 +539,26 @@ const ControlsManager = new Lang.Class({ })); }, + _updateWorkspacesGeometry: function() { + let [x, y] = this.actor.get_transformed_position(); + let [width, height] = this.actor.get_transformed_size(); + let geometry = { x: x, y: y, width: width, height: height }; + + let spacing = this.actor.get_theme_node().get_length('spacing'); + let dashWidth = this._dashSlider.getVisibleWidth() + spacing; + let thumbnailsWidth = this._thumbnailsSlider.getNonExpandedWidth() + spacing; + + geometry.width -= dashWidth; + geometry.width -= thumbnailsWidth; + + if (this.actor.get_text_direction() == Clutter.TextDirection.LTR) + geometry.x += dashWidth; + else + geometry.x += thumbnailsWidth; + + this.viewSelector.setWorkspacesGeometry(geometry); + }, + _setVisibility: function() { // Ignore the case when we're leaving the overview, since // actors will be made visible again when entering the overview diff --git a/js/ui/viewSelector.js b/js/ui/viewSelector.js index 639acf30b..a7ad1b53b 100644 --- a/js/ui/viewSelector.js +++ b/js/ui/viewSelector.js @@ -186,6 +186,10 @@ const ViewSelector = new Lang.Class({ Main.overview.fadeInDesktop(); }, + setWorkspacesGeometry: function(geom) { + this._workspacesDisplay.setWorkspacesGeometry(geom); + }, + hide: function() { this._workspacesDisplay.hide(); }, diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js index 9400d24ab..7cb3b7e58 100644 --- a/js/ui/workspacesView.js +++ b/js/ui/workspacesView.js @@ -429,7 +429,6 @@ const WorkspacesDisplay = new Lang.Class({ _init: function() { this.actor = new St.Widget({ clip_to_allocation: true }); - this.actor.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesGeometry)); this.actor.connect('parent-set', Lang.bind(this, this._parentSet)); let clickAction = new Clutter.ClickAction() @@ -631,20 +630,23 @@ const WorkspacesDisplay = new Lang.Class({ })); }, + // This geometry should always be the fullest geometry + // the workspaces switcher can ever be allocated, as if + // the sliding controls were never slid in at all. + setWorkspacesGeometry: function(geom) { + this._geometry = geom; + this._updateWorkspacesGeometry(); + }, + _updateWorkspacesGeometry: function() { if (!this._workspacesViews.length) return; - let width = this.actor.allocation.x2 - this.actor.allocation.x1; - let height = this.actor.allocation.y2 - this.actor.allocation.y1; - - let [x, y] = this.actor.get_transformed_position(); - let monitors = Main.layoutManager.monitors; let m = 0; for (let i = 0; i < monitors.length; i++) { if (i == this._primaryIndex) { - this._workspacesViews[m].setGeometry({ x: x, y: y, width: width, height: height }); + this._workspacesViews[m].setGeometry(this._geometry); m++; } else if (!this._workspacesOnlyOnPrimary) { this._workspacesViews[m].setGeometry(monitors[i]);